অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং (Object-Oriented Programming বা OOP) হলো প্রোগ্রামিংয়ের একটি পদ্ধতি, যেখানে প্রোগ্রামের বিভিন্ন উপাদানকে অবজেক্ট আকারে গঠন করে সমস্যার সমাধান করা হয়। OOP-এর মাধ্যমে প্রোগ্রামের কোড সহজে ব্যবস্থাপনা, পুনঃব্যবহার, এবং বড় সফটওয়্যার ডেভেলপমেন্টে সহায়ক হয়। OOP-এর প্রধান চারটি বৈশিষ্ট্য হলো: এনক্যাপসুলেশন (Encapsulation), ইনহেরিটেন্স (Inheritance), পলিমরফিজম (Polymorphism), এবং অ্যাবস্ট্রাকশন (Abstraction)।
ক্লাস হলো একটি ব্লুপ্রিন্ট বা টেমপ্লেট, যা অবজেক্ট তৈরি করার জন্য ব্যবহৃত হয়। ক্লাসের মধ্যে ডেটা এবং মেথড (ফাংশন) থাকে, যা ঐ ক্লাসের সব অবজেক্টে প্রযোজ্য।
উদাহরণ:
class Car {
public:
string brand;
int year;
void display() {
cout << "Brand: " << brand << ", Year: " << year << endl;
}
};
অবজেক্ট হলো ক্লাসের একটি নির্দিষ্ট উদাহরণ, যা ক্লাসের বৈশিষ্ট্য এবং মেথড ব্যবহার করে। একাধিক অবজেক্ট একই ক্লাস থেকে তৈরি করা যায়, এবং প্রতিটি অবজেক্টের জন্য ডেটা আলাদা হতে পারে।
উদাহরণ:
Car car1;
car1.brand = "Toyota";
car1.year = 2020;
car1.display();
এনক্যাপসুলেশন হলো ডেটা এবং মেথডকে একত্রিত করে একটি ইউনিট তৈরি করা, যা ডেটা সুরক্ষিত রাখে এবং বাইরের অ্যাক্সেস থেকে নিয়ন্ত্রণ করে। সি++ এ সাধারণত ক্লাসের মধ্যে প্রাইভেট (private) এবং পাবলিক (public) অ্যাক্সেস মডিফায়ার ব্যবহার করে ডেটা এনক্যাপসুলেট করা হয়।
উদাহরণ:
class Student {
private:
int id;
public:
void setId(int id) {
this->id = id;
}
int getId() {
return id;
}
};
ইনহেরিটেন্স হলো একটি ক্লাসের বৈশিষ্ট্য এবং মেথড অন্য একটি ক্লাসে উত্তরাধিকার সূত্রে পাওয়া। এতে কোডের পুনঃব্যবহার সহজ হয় এবং কোডিং কমপ্লেক্সিটি কমে।
উদাহরণ:
class Vehicle {
public:
string brand;
void honk() {
cout << "Beep beep!" << endl;
}
};
class Car : public Vehicle {
public:
int year;
};
এখানে Car
ক্লাসটি Vehicle
ক্লাস থেকে ইনহেরিট করেছে, তাই Car
অবজেক্টেও Vehicle
এর বৈশিষ্ট্যগুলি পাওয়া যাবে।
পলিমরফিজম হলো একই ফাংশনের বিভিন্ন আকারে ব্যবহার, অর্থাৎ একই মেথড বিভিন্নভাবে ব্যবহৃত হতে পারে। পলিমরফিজমের দুটি ধরন আছে: কম্পাইল টাইম পলিমরফিজম (যেমন ফাংশন ওভারলোডিং) এবং রানটাইম পলিমরফিজম (যেমন ফাংশন ওভাররাইডিং)।
ফাংশন ওভারলোডিং উদাহরণ:
class Print {
public:
void display(int i) {
cout << "Integer: " << i << endl;
}
void display(double d) {
cout << "Double: " << d << endl;
}
};
ফাংশন ওভাররাইডিং উদাহরণ:
class Animal {
public:
virtual void sound() {
cout << "Animal sound" << endl;
}
};
class Dog : public Animal {
public:
void sound() override {
cout << "Bark" << endl;
}
};
অ্যাবস্ট্রাকশন হলো প্রোগ্রামের অপ্রয়োজনীয় ডিটেইল লুকিয়ে ফেলা এবং শুধু গুরুত্বপূর্ণ তথ্য প্রকাশ করা। এটি প্রোগ্রামকে সহজ এবং পরিষ্কার করে তোলে। সি++ এ অ্যাবস্ট্রাকশন অর্জনের জন্য সাধারণত abstract class
বা interface
ব্যবহার করা হয়।
উদাহরণ:
class Shape {
public:
virtual void draw() = 0; // pure virtual function
};
class Circle : public Shape {
public:
void draw() override {
cout << "Drawing Circle" << endl;
}
};
অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং (OOP) প্রোগ্রামিংয়ের একটি শক্তিশালী পদ্ধতি, যা প্রোগ্রামকে ক্লাস ও অবজেক্টে বিভক্ত করে আরও কার্যকর, সংগঠিত এবং পুনঃব্যবহারযোগ্য করে তোলে। এর চারটি প্রধান বৈশিষ্ট্য: এনক্যাপসুলেশন, ইনহেরিটেন্স, পলিমরফিজম, এবং অ্যাবস্ট্রাকশন প্রোগ্রামিংয়ের সরলতা ও কার্যকারিতা বৃদ্ধি করে, যা বড় সফটওয়্যার ডেভেলপমেন্টে খুবই সহায়ক।
ক্লাস (Class) এবং অবজেক্ট (Object) হলো C++ প্রোগ্রামিংয়ের অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং (OOP) ধারণার দুটি প্রধান উপাদান।
ক্লাস হলো একটি টেমপ্লেট বা ব্লুপ্রিন্ট যা ডেটা এবং মেথড একত্রে সংরক্ষণ করে। এটি একটি ইউজার-ডিফাইন্ড ডেটা টাইপ, যা অবজেক্ট তৈরি করতে ব্যবহৃত হয়। ক্লাসের মধ্যে থাকা ডেটা ডেটা মেম্বার নামে পরিচিত এবং ফাংশনগুলো মেম্বার ফাংশন নামে পরিচিত। ক্লাসের মাধ্যমে একটি নতুন ডেটা টাইপ তৈরি করা হয়, যা বাস্তব জীবনের অবজেক্টকে প্রোগ্রামিংয়ে মডেল করতে সাহায্য করে।
অবজেক্ট হলো ক্লাসের একটি নির্দিষ্ট উদাহরণ (ইনস্ট্যান্স), যা ক্লাসে সংজ্ঞায়িত ডেটা এবং মেথড ব্যবহার করতে পারে। ক্লাসে সংজ্ঞায়িত গুণাবলি এবং আচরণের ভিত্তিতে অবজেক্ট তৈরি করা হয়। প্রতিটি অবজেক্টে ক্লাসের বৈশিষ্ট্যগুলো থাকে, কিন্তু তারা আলাদাভাবে সংরক্ষণ ও ব্যবহৃত হয়।
ধরা যাক, আমরা একটি Car
ক্লাস তৈরি করতে চাই, যা বিভিন্ন গাড়ির বৈশিষ্ট্য এবং ফাংশন সংরক্ষণ করবে।
#include <iostream>
using namespace std;
class Car {
public:
string brand; // ডেটা মেম্বার
int year; // ডেটা মেম্বার
// মেম্বার ফাংশন
void displayInfo() {
cout << "Brand: " << brand << ", Year: " << year << endl;
}
};
বর্ণনা:
Car
নামে একটি ক্লাস তৈরি করা হয়েছে, যা brand
এবং year
নামে দুটি ডেটা মেম্বার ধারণ করে।displayInfo()
নামে একটি মেম্বার ফাংশন রয়েছে, যা গাড়ির তথ্য প্রদর্শন করে।int main() {
Car car1; // Car ক্লাসের একটি অবজেক্ট তৈরি
car1.brand = "Toyota"; // car1 অবজেক্টের ডেটা মেম্বার সেট
car1.year = 2020;
Car car2; // Car ক্লাসের আরেকটি অবজেক্ট তৈরি
car2.brand = "Honda";
car2.year = 2019;
// অবজেক্টের মেম্বার ফাংশন কল
car1.displayInfo();
car2.displayInfo();
return 0;
}
আউটপুট:
Brand: Toyota, Year: 2020
Brand: Honda, Year: 2019
বর্ণনা:
car1
এবং car2
নামে দুটি অবজেক্ট তৈরি করা হয়েছে, যেগুলো Car
ক্লাসের ডেটা মেম্বার brand
এবং year
এর মান ধারণ করছে।displayInfo()
মেম্বার ফাংশন কল করা হয়েছে, যা তাদের গাড়ির ব্র্যান্ড এবং বছর প্রদর্শন করে।ক্লাসে তিন ধরনের অ্যাক্সেস স্পেসিফায়ার ব্যবহার করা হয়: public
, private
, এবং protected
। এগুলো নির্ধারণ করে ক্লাসের সদস্যদের অ্যাক্সেস লেভেল।
private
অ্যাক্সেস স্পেসিফায়ারclass Car {
private:
string brand; // private ডেটা মেম্বার
int year;
public:
void setInfo(string b, int y) {
brand = b;
year = y;
}
void displayInfo() {
cout << "Brand: " << brand << ", Year: " << year << endl;
}
};
বর্ণনা:
brand
এবং year
প্রাইভেট ডেটা মেম্বার, যা ক্লাসের বাইরে সরাসরি অ্যাক্সেসযোগ্য নয়।setInfo()
ফাংশন ব্যবহার করে brand
এবং year
সেট করা হয়েছে, এবং displayInfo()
ফাংশন ব্যবহার করে তথ্য প্রদর্শন করা হয়েছে।কন্সট্রাক্টর হলো একটি বিশেষ ফাংশন, যা অবজেক্ট তৈরি হওয়ার সময় স্বয়ংক্রিয়ভাবে কল হয়। এটি সাধারণত ক্লাসের ডেটা মেম্বার ইনিশিয়ালাইজ করতে ব্যবহৃত হয়। কন্সট্রাক্টরের নাম অবশ্যই ক্লাসের নামের মতো হতে হবে এবং এর কোনো রিটার্ন টাইপ থাকে না।
class Car {
public:
string brand;
int year;
Car(string b, int y) { // কন্সট্রাক্টর
brand = b;
year = y;
}
void displayInfo() {
cout << "Brand: " << brand << ", Year: " << year << endl;
}
};
ডেস্ট্রাক্টর একটি বিশেষ ফাংশন, যা অবজেক্ট ধ্বংস হওয়ার সময় স্বয়ংক্রিয়ভাবে কল হয়। এর নামও ক্লাসের নামের মতো হয়, তবে এর আগে ~
(টিল্ডা) চিহ্ন থাকে।
class Car {
public:
Car() {
cout << "Constructor called!" << endl;
}
~Car() {
cout << "Destructor called!" << endl;
}
};
১. কোড পুনঃব্যবহারযোগ্যতা: ক্লাস একবার তৈরি করলে একাধিক অবজেক্ট তৈরি করে সেটি পুনরায় ব্যবহার করা যায়। ২. ডেটা হাইডিং: প্রাইভেট মেম্বার ব্যবহার করে ডেটা গোপন রাখা যায়, যা ডেটা সুরক্ষিত রাখে। ৩. কোডের পঠনযোগ্যতা বৃদ্ধি: ক্লাসের সাহায্যে কোডকে সহজে পড়া যায় এবং সংগঠিত রাখা যায়। ৪. মডুলার প্রোগ্রামিং: বড় প্রোগ্রামকে ছোট ছোট অংশে ভাগ করা যায়, যা ডিবাগিং এবং মেইনটেনেন্সে সহায়ক।
ক্লাস এবং অবজেক্ট OOP ধারণায় প্রোগ্রামকে আরও কার্যকর এবং পুনঃব্যবহারযোগ্য করে তোলে, যা সফটওয়্যার ডেভেলপমেন্টে অত্যন্ত গুরুত্বপূর্ণ।
অ্যাক্সেস মডিফায়ার হলো প্রোগ্রামিংয়ে ব্যবহৃত এমন কিছু কীওয়ার্ড যা ক্লাসের ভেরিয়েবল এবং মেথডের অ্যাক্সেসibilটিকে নিয়ন্ত্রণ করে। সি++ এ তিন ধরনের অ্যাক্সেস মডিফায়ার রয়েছে: private, public, এবং protected। এগুলি ক্লাসের সদস্যদের অ্যাক্সেস সীমা নির্ধারণ করে এবং প্রোগ্রামে ডেটা সুরক্ষায় গুরুত্বপূর্ণ ভূমিকা পালন করে।
private
অ্যাক্সেস মডিফায়ারprivate অ্যাক্সেস মডিফায়ার দ্বারা চিহ্নিত কোনো মেম্বার ক্লাসের বাইরে থেকে সরাসরি অ্যাক্সেস করা যায় না। শুধুমাত্র ক্লাসের ভেতর থেকে এবং ক্লাসের মেথডের মাধ্যমেই এই ধরনের মেম্বারগুলো অ্যাক্সেস করা সম্ভব। এটি ডেটাকে সুরক্ষিত রাখতে সাহায্য করে।
উদাহরণ:
#include <iostream>
using namespace std;
class Car {
private:
int year; // private মেম্বার
public:
void setYear(int y) { // setter মেথড
year = y;
}
int getYear() { // getter মেথড
return year;
}
};
int main() {
Car myCar;
myCar.setYear(2020); // setYear এর মাধ্যমে year সেট করা হচ্ছে
cout << "Year: " << myCar.getYear() << endl; // getYear এর মাধ্যমে year পাওয়া যাচ্ছে
return 0;
}
ব্যাখ্যা:
year
ভেরিয়েবলটি private
, তাই সরাসরি myCar.year
দ্বারা সেটি অ্যাক্সেস করা যাবে না।setYear
এবং getYear
মেথডগুলো ব্যবহার করে year
এর মান সেট ও পড়া হচ্ছে।public
অ্যাক্সেস মডিফায়ারpublic অ্যাক্সেস মডিফায়ার দ্বারা চিহ্নিত মেম্বারগুলো ক্লাসের বাইরে থেকে সরাসরি অ্যাক্সেসযোগ্য। এগুলি ক্লাসের যে কোনো অবজেক্ট থেকে অ্যাক্সেস করা যায়।
উদাহরণ:
#include <iostream>
using namespace std;
class Car {
public:
int year; // public মেম্বার
};
int main() {
Car myCar;
myCar.year = 2020; // year সরাসরি অ্যাক্সেস ও সেট করা
cout << "Year: " << myCar.year << endl;
return 0;
}
ব্যাখ্যা:
year
ভেরিয়েবলটি public
, তাই সরাসরি myCar.year
দ্বারা সেটি অ্যাক্সেস ও সেট করা সম্ভব।public
মেম্বার হিসেবে year
সরাসরি ক্লাসের বাইরেও ব্যবহার করা যায়।protected
অ্যাক্সেস মডিফায়ারprotected অ্যাক্সেস মডিফায়ার দ্বারা চিহ্নিত মেম্বারগুলো শুধুমাত্র ক্লাসের ভেতরে এবং সেই ক্লাস থেকে ইনহেরিট করা ক্লাসে অ্যাক্সেসযোগ্য। কিন্তু, ক্লাসের বাইরে থেকে সরাসরি অ্যাক্সেস করা যায় না। এটি ইনহেরিটেন্সের ক্ষেত্রে ডেটা সুরক্ষিত রাখতে সহায়ক।
উদাহরণ:
#include <iostream>
using namespace std;
class Vehicle {
protected:
string brand; // protected মেম্বার
public:
void setBrand(string b) {
brand = b;
}
};
class Car : public Vehicle {
public:
void display() {
cout << "Brand: " << brand << endl; // protected মেম্বার subclass এ অ্যাক্সেসযোগ্য
}
};
int main() {
Car myCar;
myCar.setBrand("Toyota");
myCar.display(); // Displaying the brand
return 0;
}
ব্যাখ্যা:
brand
মেম্বারটি protected
, যা Vehicle
ক্লাসের Car
ইনহেরিটেড ক্লাস থেকে অ্যাক্সেসযোগ্য।setBrand
মেথডটি ব্যবহার করে brand
এর মান সেট করা হয়েছে, যা display
মেথডে অ্যাক্সেসযোগ্য।অ্যাক্সেস মডিফায়ার | ক্লাসের ভিতরে | ইনহেরিটেড ক্লাসে | ক্লাসের বাইরে |
---|---|---|---|
private | ✔️ | ❌ | ❌ |
protected | ✔️ | ✔️ | ❌ |
public | ✔️ | ✔️ | ✔️ |
অ্যাক্সেস মডিফায়ার সি++ এ ডেটা এবং মেথডের অ্যাক্সেসibilটি নিয়ন্ত্রণের জন্য ব্যবহৃত হয়। private
মেম্বার শুধুমাত্র ক্লাসের ভিতরে অ্যাক্সেসযোগ্য, protected
মেম্বার ক্লাসের ভিতরে এবং ইনহেরিটেড ক্লাসে অ্যাক্সেসযোগ্য, এবং public
মেম্বার ক্লাসের বাইরেও অ্যাক্সেসযোগ্য। অ্যাক্সেস মডিফায়ার প্রোগ্রামের ডেটা সুরক্ষা এবং সঠিক ব্যবস্থাপনার জন্য অত্যন্ত গুরুত্বপূর্ণ।
কনস্ট্রাক্টর (Constructor) এবং ডেস্ট্রাক্টর (Destructor) হলো C++ ক্লাসের বিশেষ ফাংশন। এদের মূল কাজ হলো অবজেক্ট তৈরি ও ধ্বংসের সময় নির্দিষ্ট কার্য সম্পাদন করা।
কনস্ট্রাক্টর হলো একটি বিশেষ ধরনের ফাংশন, যা ক্লাসের অবজেক্ট তৈরি হওয়ার সময় স্বয়ংক্রিয়ভাবে কল হয়। এটি সাধারণত ক্লাসের ডেটা মেম্বার ইনিশিয়ালাইজ করতে ব্যবহৃত হয়।
void
ও নয়।#include <iostream>
using namespace std;
class Car {
public:
string brand;
int year;
// ডিফল্ট কনস্ট্রাক্টর
Car() {
brand = "Unknown";
year = 0;
}
// প্যারামিটারাইজড কনস্ট্রাক্টর
Car(string b, int y) {
brand = b;
year = y;
}
void displayInfo() {
cout << "Brand: " << brand << ", Year: " << year << endl;
}
};
int main() {
Car car1; // ডিফল্ট কনস্ট্রাক্টর কল হবে
Car car2("Toyota", 2020); // প্যারামিটারাইজড কনস্ট্রাক্টর কল হবে
car1.displayInfo(); // Output: Brand: Unknown, Year: 0
car2.displayInfo(); // Output: Brand: Toyota, Year: 2020
return 0;
}
বর্ণনা:
Car
ক্লাসে দুটি কনস্ট্রাক্টর আছে। Car()
হলো ডিফল্ট কনস্ট্রাক্টর, যা car1
অবজেক্ট তৈরি করার সময় কল হয়েছে এবং Car(string b, int y)
হলো প্যারামিটারাইজড কনস্ট্রাক্টর, যা car2
অবজেক্ট তৈরি করার সময় কল হয়েছে।ডেস্ট্রাক্টর হলো একটি বিশেষ ফাংশন, যা অবজেক্ট ধ্বংস হওয়ার সময় স্বয়ংক্রিয়ভাবে কল হয়। এটি অবজেক্টের মেমোরি মুক্ত করতে বা ক্লিনআপ কার্য সম্পাদন করতে ব্যবহৃত হয়। C++ এ প্রতিটি ক্লাসের কেবলমাত্র একটি ডেস্ট্রাক্টর থাকতে পারে।
~
(টিল্ডা) চিহ্ন থাকে।#include <iostream>
using namespace std;
class Car {
public:
string brand;
int year;
// প্যারামিটারাইজড কনস্ট্রাক্টর
Car(string b, int y) {
brand = b;
year = y;
cout << "Constructor called for " << brand << endl;
}
// ডেস্ট্রাক্টর
~Car() {
cout << "Destructor called for " << brand << endl;
}
void displayInfo() {
cout << "Brand: " << brand << ", Year: " << year << endl;
}
};
int main() {
Car car1("Toyota", 2020);
Car car2("Honda", 2019);
car1.displayInfo();
car2.displayInfo();
return 0;
}
আউটপুট:
Constructor called for Toyota
Constructor called for Honda
Brand: Toyota, Year: 2020
Brand: Honda, Year: 2019
Destructor called for Honda
Destructor called for Toyota
বর্ণনা:
Car
ক্লাসে একটি ডেস্ট্রাক্টর ~Car()
তৈরি করা হয়েছে, যা অবজেক্ট ধ্বংস হওয়ার সময় স্বয়ংক্রিয়ভাবে কল হয়।car2
এবং car1
অবজেক্টের জন্য ডেস্ট্রাক্টর কল হয় এবং "Destructor called for Honda"
এবং "Destructor called for Toyota"
মেসেজ প্রিন্ট হয়।বৈশিষ্ট্য | কনস্ট্রাক্টর | ডেস্ট্রাক্টর |
---|---|---|
কাজ | অবজেক্ট তৈরি করার সময় ইনিশিয়ালাইজেশন করা | অবজেক্ট ধ্বংস করার সময় ক্লিনআপ করা |
নাম | ক্লাসের নামের মতো | ক্লাসের নামের আগে ~ চিহ্ন থাকে |
রিটার্ন টাইপ | রিটার্ন টাইপ নেই | রিটার্ন টাইপ নেই |
প্যারামিটার | প্যারামিটার থাকতে পারে | প্যারামিটার থাকতে পারে না |
ওভারলোডিং সমর্থন | ওভারলোডিং সমর্থন করে | ওভারলোডিং সমর্থন করে না |
ইনহেরিটেন্স (Inheritance) এবং পলিমরফিজম (Polymorphism) হলো C++ প্রোগ্রামিংয়ের অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং (OOP) এর দুটি প্রধান ধারণা। এগুলো প্রোগ্রামে কোড পুনঃব্যবহারযোগ্যতা, সংহতি, এবং ডায়নামিক বৈশিষ্ট্য প্রদান করে, যা সফটওয়্যার ডেভেলপমেন্টকে সহজ করে তোলে।
ইনহেরিটেন্স হলো একটি প্রক্রিয়া যার মাধ্যমে একটি ক্লাস (ডেরাইভড বা সাবক্লাস) আরেকটি ক্লাসের (বেস ক্লাস বা সুপারক্লাস) গুণাবলি এবং আচরণ (ডেটা মেম্বার এবং মেম্বার ফাংশন) অর্জন করে। ইনহেরিটেন্সের মাধ্যমে কোড পুনঃব্যবহারযোগ্যতা বৃদ্ধি পায় এবং ক্লাসগুলির মধ্যে একটি সম্পর্ক তৈরি হয়।
ধরা যাক, আমরা একটি Vehicle
বেস ক্লাস তৈরি করবো এবং তার থেকে Car
এবং Bike
নামের দুটি ডেরাইভড ক্লাস তৈরি করবো।
#include <iostream>
using namespace std;
// বেস ক্লাস
class Vehicle {
public:
string brand = "Generic Brand";
void honk() {
cout << "Beep! Beep!" << endl;
}
};
// ডেরাইভড ক্লাস
class Car : public Vehicle {
public:
int doors = 4;
};
// ডেরাইভড ক্লাস
class Bike : public Vehicle {
public:
bool hasCarrier = true;
};
int main() {
Car myCar;
Bike myBike;
cout << "Car Brand: " << myCar.brand << endl; // বেস ক্লাসের মেম্বার
myCar.honk(); // বেস ক্লাসের মেম্বার ফাংশন
cout << "Car Doors: " << myCar.doors << endl;
cout << "Bike Brand: " << myBike.brand << endl; // বেস ক্লাসের মেম্বার
myBike.honk(); // বেস ক্লাসের মেম্বার ফাংশন
cout << "Has Carrier: " << (myBike.hasCarrier ? "Yes" : "No") << endl;
return 0;
}
বর্ণনা:
Vehicle
হলো বেস ক্লাস, যা Car
এবং Bike
ক্লাসের জন্য ইনহেরিটেড হয়েছে।Car
এবং Bike
তাদের নিজস্ব মেম্বার এবং বৈশিষ্ট্য ধারণ করে, তবে তারা Vehicle
ক্লাসের brand
মেম্বার এবং honk()
মেথডও ব্যবহার করতে পারে।পলিমরফিজম শব্দের অর্থ "একাধিক আকার ধারণ করা"। প্রোগ্রামিংয়ে এটি একটি বৈশিষ্ট্য, যার মাধ্যমে একই মেথড বা অপারেটর বিভিন্ন পরিস্থিতিতে ভিন্ন ভিন্ন আকারে কাজ করতে পারে। C++ এ পলিমরফিজম দুই প্রকার:
কাম্পাইল টাইম পলিমরফিজম:
রানটাইম পলিমরফিজম:
#include <iostream>
using namespace std;
class Print {
public:
void display(int i) {
cout << "Integer: " << i << endl;
}
void display(double d) {
cout << "Double: " << d << endl;
}
void display(string str) {
cout << "String: " << str << endl;
}
};
int main() {
Print printer;
printer.display(5);
printer.display(3.14);
printer.display("Hello");
return 0;
}
বর্ণনা:
display
ফাংশনটি একই নামে তিনবার সংজ্ঞায়িত করা হয়েছে, যা বিভিন্ন ডেটা টাইপের প্যারামিটার গ্রহণ করে।#include <iostream>
using namespace std;
class Animal {
public:
virtual void sound() {
cout << "Animal Sound" << endl;
}
};
class Dog : public Animal {
public:
void sound() override { // বেস ক্লাসের ফাংশন ওভাররাইড করা হয়েছে
cout << "Bark" << endl;
}
};
class Cat : public Animal {
public:
void sound() override {
cout << "Meow" << endl;
}
};
int main() {
Animal *a1 = new Dog();
Animal *a2 = new Cat();
a1->sound(); // Bark
a2->sound(); // Meow
delete a1;
delete a2;
return 0;
}
বর্ণনা:
Animal
ক্লাসে sound
নামে একটি ভার্চুয়াল ফাংশন রয়েছে। Dog
এবং Cat
ক্লাসে এই ফাংশনটি ওভাররাইড করা হয়েছে।a1
এবং a2
পয়েন্টারগুলো Animal
টাইপ হলেও তারা তাদের নিজ নিজ ক্লাসের sound()
ফাংশন কল করছে, যা পলিমরফিজমের উদাহরণ।ইনহেরিটেন্স এবং পলিমরফিজম OOP এর শক্তিশালী বৈশিষ্ট্য, যা বড় প্রোগ্রাম ও সফটওয়্যার ডেভেলপমেন্টে কার্যকরী এবং পুনঃব্যবহারযোগ্য কোড রচনা করতে সহায়ক।
পয়েন্টার টু অবজেক্ট (Pointer to Object) এবং this পয়েন্টার (this Pointer) C++ প্রোগ্রামিংয়ের দুটি গুরুত্বপূর্ণ পয়েন্টার ধারণা, যা অবজেক্টের সাথে সরাসরি কাজ করার সুবিধা দেয়। নিচে এই দুটি বিষয়ে বিস্তারিত আলোচনা করা হলো।
পয়েন্টার টু অবজেক্ট হলো এমন একটি পয়েন্টার, যা কোনো নির্দিষ্ট ক্লাসের অবজেক্টের ঠিকানা ধারণ করে। সাধারণ পয়েন্টার যেমন কোনো ভ্যারিয়েবলের ঠিকানা ধারণ করতে পারে, তেমনিভাবে পয়েন্টার টু অবজেক্ট কোনো অবজেক্টের ঠিকানা ধরে রাখতে পারে এবং সেই অবজেক্টের ডেটা মেম্বার ও মেম্বার ফাংশন অ্যাক্সেস করতে পারে।
#include <iostream>
using namespace std;
class Car {
public:
string brand;
int year;
void displayInfo() {
cout << "Brand: " << brand << ", Year: " << year << endl;
}
};
int main() {
Car car1; // Car ক্লাসের একটি অবজেক্ট তৈরি
car1.brand = "Toyota";
car1.year = 2020;
Car *ptr = &car1; // car1 অবজেক্টের ঠিকানা ধরে রাখা হলো
// পয়েন্টার ব্যবহার করে অবজেক্টের মেম্বার অ্যাক্সেস
ptr->displayInfo(); // Output: Brand: Toyota, Year: 2020
return 0;
}
বর্ণনা:
car1
নামে একটি অবজেক্ট তৈরি করা হয়েছে এবং Car *ptr
এর মাধ্যমে car1
এর ঠিকানা পয়েন্টারে ধরে রাখা হয়েছে।ptr->displayInfo()
দিয়ে পয়েন্টার ব্যবহার করে অবজেক্টের মেম্বার ফাংশন displayInfo()
অ্যাক্সেস করা হয়েছে।->
(arrow) অপারেটর ব্যবহার করা হয়।১. অবজেক্টের মেমোরি অ্যাড্রেস অ্যাক্সেস: এটি সরাসরি অবজেক্টের ঠিকানা নিয়ে কাজ করতে পারে, যা মেমোরি ব্যবস্থাপনায় সহায়ক। ২. ডাইনামিক অবজেক্ট তৈরি: পয়েন্টার ব্যবহার করে ডাইনামিক্যালি অবজেক্ট তৈরি এবং পরিচালনা করা যায়। ৩. কয়েকটি অবজেক্ট একসাথে পরিচালনা: একই ক্লাসের একাধিক অবজেক্ট তৈরি করলে, তাদের পয়েন্টার ব্যবহার করে সহজেই পরিচালনা করা যায়।
this
পয়েন্টার (this Pointer)this পয়েন্টার হলো C++ এর একটি বিশেষ পয়েন্টার, যা প্রতিটি অবজেক্টের জন্য ক্লাসের ভিতরে স্বয়ংক্রিয়ভাবে তৈরি হয়। এটি বর্তমানে যে অবজেক্টে কাজ চলছে, তার ঠিকানা নির্দেশ করে। মেম্বার ফাংশনের ভিতরে this
পয়েন্টার ব্যবহার করা হয়।
this
পয়েন্টারের ব্যবহার১. মেম্বার ভ্যারিয়েবল এবং প্যারামিটার ভ্যারিয়েবল পৃথক করা: যদি মেম্বার ভ্যারিয়েবল এবং ফাংশনের প্যারামিটার একই নামে হয়, তখন this
পয়েন্টার ব্যবহার করে মেম্বার ভ্যারিয়েবলকে শনাক্ত করা যায়। ২. চেইনিং: ফাংশনের মধ্যে this
পয়েন্টার ব্যবহার করে ফাংশন চেইনিং করা যায়।
this
পয়েন্টার ব্যবহার করে মেম্বার অ্যাক্সেস#include <iostream>
using namespace std;
class Car {
private:
string brand;
int year;
public:
// কনস্ট্রাক্টর
Car(string brand, int year) {
this->brand = brand; // this পয়েন্টার ব্যবহার করে মেম্বার অ্যাক্সেস
this->year = year;
}
// মেম্বার ফাংশন
void displayInfo() {
cout << "Brand: " << this->brand << ", Year: " << this->year << endl;
}
};
int main() {
Car car1("Toyota", 2020);
car1.displayInfo(); // Output: Brand: Toyota, Year: 2020
return 0;
}
বর্ণনা:
Car
ক্লাসের কনস্ট্রাক্টরের মধ্যে brand
এবং year
নামে দুটি মেম্বার ভ্যারিয়েবল এবং দুটি প্যারামিটার একই নামে রয়েছে।this->brand
এবং this->year
ব্যবহার করে মেম্বার ভ্যারিয়েবলকে প্যারামিটার থেকে আলাদা করা হয়েছে।this
পয়েন্টার প্রতিটি অবজেক্টের জন্য আলাদা হয় এবং বর্তমান অবজেক্টের ঠিকানা নির্দেশ করে।this
পয়েন্টারের পার্থক্যবৈশিষ্ট্য | পয়েন্টার টু অবজেক্ট | this পয়েন্টার |
---|---|---|
উদ্দেশ্য | নির্দিষ্ট অবজেক্টের ঠিকানা ধরে রাখে | বর্তমান অবজেক্টের ঠিকানা নির্দেশ করে |
ব্যবহারের স্থান | ক্লাসের বাইরে থেকে অবজেক্ট অ্যাক্সেসে ব্যবহৃত হয় | শুধুমাত্র ক্লাসের ভিতরে ব্যবহৃত হয় |
কাস্টম পয়েন্টার | হ্যাঁ, অবজেক্টের ঠিকানা ধরে রাখতে আলাদা পয়েন্টার তৈরি করা যায় | না, C++ নিজেই this পয়েন্টার তৈরি করে |
অ্যাক্সেস স্টাইল | -> অপারেটরের মাধ্যমে মেম্বার অ্যাক্সেস | this-> ব্যবহার করে মেম্বার অ্যাক্সেস |
C++ এ new
অপারেটর ব্যবহার করে ডাইনামিক্যালি অবজেক্ট তৈরি করা যায় এবং পয়েন্টারের মাধ্যমে তা অ্যাক্সেস করা যায়।
#include <iostream>
using namespace std;
class Car {
public:
string brand;
int year;
Car(string b, int y) {
brand = b;
year = y;
}
void displayInfo() {
cout << "Brand: " << brand << ", Year: " << year << endl;
}
};
int main() {
// ডাইনামিক্যালি অবজেক্ট তৈরি
Car *ptr = new Car("Honda", 2021);
// পয়েন্টার দিয়ে মেম্বার ফাংশন কল
ptr->displayInfo(); // Output: Brand: Honda, Year: 2021
delete ptr; // ডাইনামিক মেমোরি মুক্ত করা
return 0;
}
বর্ণনা:
new Car("Honda", 2021);
ব্যবহার করে ডাইনামিক্যালি Car
অবজেক্ট তৈরি করা হয়েছে এবং এটি ptr
পয়েন্টারে সংরক্ষণ করা হয়েছে।delete ptr;
স্টেটমেন্ট ব্যবহার করে মেমোরি মুক্ত করা হয়েছে।->
অপারেটর ব্যবহার করে সেই অবজেক্টের মেম্বার অ্যাক্সেস করা যায়।this
পয়েন্টার: C++ এর একটি বিশেষ পয়েন্টার, যা বর্তমান অবজেক্টের ঠিকানা নির্দেশ করে এবং সাধারণত মেম্বার ভ্যারিয়েবল এবং প্যারামিটার আলাদা করতে বা চেইনিংয়ের জন্য ব্যবহৃত হয়।পয়েন্টার টু অবজেক্ট এবং this
পয়েন্টার ব্যবহারে মেমোরি ব্যবস্থাপনা ও অবজেক্ট ম্যানিপুলেশন সহজ হয়, যা প্রোগ্রামিংয়ে আরও কার্যকর ও শক্তিশালী নিয়ন্ত্রণ প্রদান করে।
ফ্রেন্ড ফাংশন (Friend Function) এবং ফ্রেন্ড ক্লাস (Friend Class) C++ এ ব্যবহৃত বিশেষ ফিচার, যা ক্লাসের প্রাইভেট (private) এবং প্রোটেকটেড (protected) মেম্বারগুলোতে বাইরের ফাংশন বা অন্য ক্লাসের অ্যাক্সেসের অনুমতি দেয়। সাধারণত, ক্লাসের প্রাইভেট মেম্বারে সরাসরি বাইরের অ্যাক্সেস অনুমোদিত নয়, কিন্তু ফ্রেন্ড ফাংশন বা ফ্রেন্ড ক্লাসের মাধ্যমে সেই সীমাবদ্ধতা দূর করা যায়।
ফ্রেন্ড ফাংশন হলো একটি ফাংশন, যা কোনো ক্লাসের private
এবং protected
মেম্বারে সরাসরি অ্যাক্সেস করতে পারে। এই ফাংশনকে ফ্রেন্ড করার জন্য ক্লাসে friend
কীওয়ার্ড ব্যবহার করে ঘোষণা করা হয়।
#include <iostream>
using namespace std;
class Box {
private:
int width;
public:
Box(int w) : width(w) {} // কন্সট্রাক্টর
// ফ্রেন্ড ফাংশন ঘোষণা
friend void displayWidth(Box &b);
};
// ফ্রেন্ড ফাংশন ডেফিনেশন
void displayWidth(Box &b) {
cout << "Width: " << b.width << endl; // প্রাইভেট মেম্বারে অ্যাক্সেস
}
int main() {
Box myBox(10); // Box অবজেক্ট তৈরি
displayWidth(myBox); // ফ্রেন্ড ফাংশন কল
return 0;
}
বর্ণনা:
Box
ক্লাসের width
নামের একটি প্রাইভেট মেম্বার আছে।displayWidth()
নামে একটি ফাংশন Box
ক্লাসের ফ্রেন্ড ফাংশন হিসেবে ঘোষণা করা হয়েছে।displayWidth()
ফাংশন width
মেম্বারে সরাসরি অ্যাক্সেস করতে সক্ষম, কারণ এটি Box
ক্লাসের ফ্রেন্ড ফাংশন।public
, private
, এবং protected
মেম্বারে সরাসরি অ্যাক্সেস করতে পারে।::
অপারেটর ব্যবহার করে কল করতে হয় না।ফ্রেন্ড ক্লাস হলো একটি ক্লাস, যা আরেকটি ক্লাসের সমস্ত private
এবং protected
মেম্বারে সরাসরি অ্যাক্সেস করতে পারে। friend
কীওয়ার্ড ব্যবহার করে একটি ক্লাসকে অন্য ক্লাসের ফ্রেন্ড করা যায়। ফ্রেন্ড ক্লাস মূলত তখনই ব্যবহৃত হয়, যখন দুটি ক্লাস ঘনিষ্ঠভাবে সম্পর্কিত হয় এবং একে অপরের তথ্য অ্যাক্সেসের প্রয়োজন হয়।
#include <iostream>
using namespace std;
class Engine {
private:
int horsepower;
public:
Engine(int hp) : horsepower(hp) {}
// Car ক্লাসকে friend হিসেবে ঘোষণা করা
friend class Car;
};
class Car {
public:
void showHorsepower(Engine &e) {
cout << "Horsepower: " << e.horsepower << endl; // প্রাইভেট মেম্বারে অ্যাক্সেস
}
};
int main() {
Engine engine(300); // Engine অবজেক্ট তৈরি
Car car;
car.showHorsepower(engine); // Car ক্লাসের মাধ্যমে horsepower দেখানো
return 0;
}
বর্ণনা:
Engine
ক্লাসে horsepower
নামে একটি প্রাইভেট মেম্বার আছে।Car
ক্লাসকে Engine
ক্লাসের ফ্রেন্ড ক্লাস হিসেবে ঘোষণা করা হয়েছে, যার ফলে Car
ক্লাস Engine
এর প্রাইভেট মেম্বার horsepower
-এ অ্যাক্সেস করতে পারে।Car
ক্লাসের showHorsepower()
মেম্বার ফাংশন engine
অবজেক্টের horsepower
মেম্বার অ্যাক্সেস করতে সক্ষম, কারণ এটি ফ্রেন্ড ক্লাস।ফ্রেন্ড ফাংশন এবং ফ্রেন্ড ক্লাস C++ এ ডেটা অ্যাক্সেসibilটি নিয়ন্ত্রণের জন্য এবং নির্দিষ্ট পরিস্থিতিতে ডেটা হাইডিং বজায় রেখে প্রাইভেট মেম্বারে অ্যাক্সেসের সুবিধার্থে ব্যবহৃত হয়।
common.read_more